/**
 * 角度数转弧度数
 * @param {number} a 角度数
 * @returns {number} 弧度数
 */
const ator = (a) => {
  return a * Math.PI / 180;
}

/**
 * 从点 A 观察空间内一点 G，并将之投影到 xy 平面坐标
 * @param {{x: number, y: number, z: number}} A 观察点A
 * @param {{x: number, y: number, z: number}} G 被观察点G
 * @param {number} ox x 轴偏移量
 * @param {number} oy y 轴偏移量
 * @returns {x: number, y: number}
 */
const transformPointToXY = (A, G, ox, oy) => {
  return {
    x: (G.x - A.x) * A.z / (A.z - G.z) + ox,
    y: (G.y - A.y) * A.z / (A.z - G.z) + oy
  }
}

/**
 * 点绕 Y 轴旋转的坐标变换算法
 * @param {{x: number, y: number, z: number}} A 待转点坐标
 * @param {number} deg 旋转角度
 * @param {boolean} antiClockwise 是否逆时针，默认 false
 * @returns {{x: number, y: number, z: number}} 变换后坐标
 */
const transformPointRotateByY = (A, deg, antiClockwise) => {
  let tempDeg = antiClockwise ? -1 * deg : deg, ret = {};
  with(Math) {
    ret.x = A.x * cos(ator(tempDeg)) - A.z * sin(ator(tempDeg)),
    ret.y = A.y,
    ret.z = A.z * cos(ator(tempDeg)) + A.x * sin(ator(tempDeg))
  }
  return ret;
}